#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>

using namespace std;
using LL = long long;
const int N = 1e3 + 10, M = 25;

struct Node
{
    int a[M];

    Node operator+ (const Node & w){
        Node res;
        for(int i = 0; i < 20; i ++){
            res.a[i] = (6 - a[i] - w.a[i]) % 3;
        }
        return res;
    }

    int calc(){
        int res = 0;
        for(int i = 0; i < 20; i ++){
            res = res * 3;
            res = res + a[i];
        }
        return res;
    }
}node[N];

int n, k;




int main(){
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k;
    map<int, int> mp;
    for(int i = 0; i < n; i ++){
        for(int j = 0; j < k; j ++){
            cin >> node[i].a[j];
        }
    }


    for(int i = 0; i < n; i ++){
        for(int j = i + 1; j < n; j ++){
            Node res = node[i] + node[j];
            mp[res.calc()] ++;
        }
    }

    int res = 0;
    for(int i = 0; i < n; i ++){
        int k = mp[node[i].calc()];
        res = res + k * (k - 1) / 2;
    }

    cout << res << '\n';

    


    return 0;
}